package com.itheima.mobilesafe69.activity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONException;
import org.json.JSONObject;
import com.itheima.mobilesafe69.R;
import com.itheima.mobilesafe69.utils.ConstantValue;
import com.itheima.mobilesafe69.utils.PrefUtils;
import com.itheima.mobilesafe69.utils.StreamUtil;
import com.itheima.mobilesafe69.utils.ToastUtil;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.animation.AlphaAnimation;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class SplashActivity extends Activity {
	protected static final String tag = "SplashActivity";
	
	/**
	 * 需要更新apk,状态码
	 */
	protected static final int UPDATE_VERSION = 100;

	/**
	 * 进入应用程序主界面状态码
	 */
	protected static final int ENTER_HOME = 101;

	protected static final int URL_ERROR = 102;
	protected static final int IO_ERROR = 103;
	protected static final int JSON_ERROR = 104;
	
	private TextView tv_version_name;
	private String mVersionDes;
	private String mDownloadUrl;
	
	private Handler mHandler = new Handler(){//membar	成员变量
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case UPDATE_VERSION:
				//提示用户更新APK
				showUpdateDialog();
				break;
			case ENTER_HOME:
				enterHome();
				break;
			case URL_ERROR:
				ToastUtil.show(getApplicationContext(),"url异常");
				enterHome();
				break;
			case IO_ERROR:
				ToastUtil.show(getApplicationContext(),"IO异常");
				enterHome();
				break;
			case JSON_ERROR:
				ToastUtil.show(getApplicationContext(),"JSON解析异常");
				enterHome();
				break;
			}
		};
	};

	private RelativeLayout rl_root;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//告知此activity没有头
		/*requestWindowFeature(Window.FEATURE_NO_TITLE);*/
		setContentView(R.layout.activity_splash);
		
		//初始化控件的操作
		initUI();
		//初始化数据的方法
		initData();
		//初始化动画,动画执行方法,淡入淡出
		initAnimation();
		//初始化数据库操作
		initDataBase();
		boolean has_short_cut = PrefUtils.getBoolean(this,ConstantValue.HAS_SHORT_CUT, false);
		if(!has_short_cut){
			//是否生成快捷方式的方法
			initShortCut();
		}
	}

	private void initShortCut() {
		//快捷方式只生成一个
		//图片
		//文字
		//点击此快捷方式开启的意图
		
		//生成快捷方式,其实就是去发送一条广播,上诉的内容,都可以封装到广播的intent中,权限
		Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
		//第二个参数,将资源文件中的一张图片装换成Bitmap,作为数据在发送广播的过程中传递出去
		intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, 
				BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
		intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "黑马卫士");
		
		//点开快捷方式的意图
		Intent shortCutIntent = new Intent();
		shortCutIntent.setAction("com.itheima.mobilesafe69");
		shortCutIntent.addCategory("android.intent.category.DEFAULT");
		
		intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortCutIntent);
		sendBroadcast(intent);
		
		PrefUtils.putBoolean(this,ConstantValue.HAS_SHORT_CUT, true);
	}

	private void initDataBase() {
		copyDB("address.db");
		copyDB("commonnum.db");
		copyDB("antivirus.db");
	}

	private void copyDB(String dbName) {
		//1,将电话号码归属地数据库拷贝到,工程的第三方资产目录
		//2,将第三方资产文件中的数据库,读取到工程的files文件夹
		//2.1获取file文件夹路径
		File filesDir = getFilesDir();
		//2.2创建相应文件夹下文件
		File file = new File(filesDir,dbName);
		if(file.exists()){
			return;
		}
		InputStream is = null;
		FileOutputStream fos = null;
		//2.3打开第三方资产目录,并且将数据库通过流的方式读取出来
		try {
			is = getAssets().open(dbName);
			//2.4写入指定文件
			byte[] buffer = new byte[1024];
			int temp = -1;
			fos = new FileOutputStream(file);
			while((temp = is.read(buffer))!=-1){
				fos.write(buffer, 0, temp);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(is!=null && fos!=null){
					is.close();
					fos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private void initAnimation() {
		AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
		alphaAnimation.setDuration(3000);
		rl_root.startAnimation(alphaAnimation);
	}

	protected void showUpdateDialog() {
		//对话框依赖于activity
		//吐司和activity没有关联
		Builder builder = new AlertDialog.Builder(this);
		
		//屏蔽返回按钮,不建议
//		builder.setCancelable(false);
		
		builder.setTitle("是否更新?");
		builder.setIcon(R.drawable.ic_launcher);
		//描述信息
		builder.setMessage(mVersionDes);
		
		//立即更新(积极)
		builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//下载逻辑,(多线程断线续传),第三方框架(Xutils)
				downloadApk();
			}
		});
		
		
		//稍后再说(消极)
		builder.setNegativeButton("稍后再说",new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//取消
				dialog.dismiss();
				//依然需要跳转到应用程序主界面
				enterHome();
			}
		});
		
		builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				//对话框取消
				dialog.dismiss();
				//依然需要跳转到应用程序主界面
				enterHome();
			}
		});
		
		builder.show();
	}

	protected void downloadApk() {
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath()
					+File.separator+"mobilesafe69.apk";
			HttpUtils httpUtils = new HttpUtils();
			//(下载地址,下载应用存放位置(sd卡),下载过程中方法的回调)
			httpUtils.download(
					mDownloadUrl, sdPath, 
					new RequestCallBack<File>() {
						@Override
						public void onSuccess(ResponseInfo<File> responseInfo) {
							Log.i(tag, "下载成功");
							//下载过后从服务端获取到的apk
							File file = responseInfo.result;
							//安装apk过程,android源码中找到apk安装过程,android系统在安装应用,开启一个activity,
							installApk(file);
						}
						@Override
						public void onFailure(HttpException arg0, String arg1) {
							Log.i(tag, "下载失败");
						}
						@Override
						public void onLoading(long total, long current,
								boolean isUploading) {
							super.onLoading(total, current, isUploading);
							Log.i(tag, "下载过程中");
						}
						@Override
						public void onStart() {
							super.onStart();
							Log.i(tag, "下载开始");
						}
					});
		}
	}

	protected void installApk(File file) {
		//通过隐式意图去开启activity
		Intent intent = new Intent();
		intent.setAction("android.intent.action.VIEW");
		intent.addCategory("android.intent.category.DEFAULT");
		/*intent.setData(Uri.fromFile(file));
		intent.setType("application/vnd.android.package-archive");*/
		intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
//		startActivity(intent);
		startActivityForResult(intent,0);
	}
	
	//接收后一个界面返回结果的方法
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		enterHome();
		super.onActivityResult(requestCode, resultCode, data);
	}

	/**
	 * 进入应用程序主界面
	 */
	protected void enterHome() {
		//activity跳转
		Intent intent = new Intent(this,HomeActivity.class);
		startActivity(intent);
		
		finish();
	}

	/**
	 * alt+shift+j	
	 * 初始化数据
	 */
	private void initData() {
		tv_version_name.setText("版本名称:"+getVersionName());
		//获取本地的版本号,检测升级(本地版本号<小于服务器版本号,服务器有一个更高版本的应用)
		//数据的传递
		//客户端:发送http请求  http://www.oxx.com/index.jsp?key=value
		//服务器:在接受到请求以后,给客户端发送数据,(json,xml),json数据从数据库中读取出来,读取数据拼接json,语法规则,结构
		//服务端返回字段
		//1 新版本应用描述
		//2新版本版本号(本地版本比大小)
		//3新版本版本名称
		//4,新版本apk下载地址
		/* {}:json对象,json对象中可以包含多个字段,字段的值,就是在客户端上要去显示的文字以及应用的下载地址
		 *{
			key:value,
			key:value,
			key:value
		  }
		*/
		
		boolean is_Update = PrefUtils.getBoolean(this, ConstantValue.UPDATE_VERSION, false);
		
		if(is_Update){
			checkVersion();
		}else{
			//延时跳转到主界面过程,消息机制
//			mHandler.sendEmptyMessage(0);
			//通过消息机制延时处理消息,在4秒后处理消息的时候,去跳转到主界面
			
			//1,延时消息类型状态码 2,延时处理此消息的时间
			mHandler.sendEmptyMessageDelayed(ENTER_HOME, 4000);
		}
		
		/*new Thread(new Runnable() {
			@Override
			public void run() {
				
			}
		}).start();*/
	}

	/**
	 * 通过版本号,检测版本更新
	 */
	private void checkVersion() {
		new Thread(){
			public void run() {
				Message msg = Message.obtain();
				long startTime = System.currentTimeMillis();
				try {
					//1,获取访问网络Url地址    http://192.168.1.250:8080/update69.json	   http://10.0.2.2:8080/update69.json
					URL url = new URL("http://10.0.2.2:8080/update69.json");
					//2,在此url地址上去开启一个连接请求
					HttpURLConnection connection = (HttpURLConnection) url.openConnection();
					//3,请求的配置信息
					connection.setConnectTimeout(2000);
					connection.setReadTimeout(2000);
					//4,通过服务端返回的响应码,判断是否请求成功
					if(connection.getResponseCode() == 200){
						//5,读取服务端返回的数据,流
						InputStream inputStream = connection.getInputStream();
						//6,流转换成字符串,常见,工具类
						String jsonStr = StreamUtil.stream2String(inputStream);
						
						Log.i(tag, "jsonStr = "+jsonStr);
						//7,json解析,看见什么就解析什么,参数就是要去解析的json字符串
						JSONObject jsonObject = new JSONObject(jsonStr);
						//8,逐个解析字段
						String versionName = jsonObject.getString("versionName");
						String versionCode = jsonObject.getString("versionCode");
						
						//alt+shift+R
						mVersionDes = jsonObject.getString("versionDes");
						
						mDownloadUrl = jsonObject.getString("downloadUrl");
						
						//9,本地版本号<服务端版本号,比较大小,提示用户有更新版本的apk可下载
						int localVersionCode = getVersionCode();
						int remoteVersionCode = Integer.parseInt(versionCode);
						
						if(localVersionCode<remoteVersionCode){
							//提示用户更新,ctrl+shift+X 大	ctrl+shift+y 小写   
							msg.what = UPDATE_VERSION;
						}else{
							//进入应用的主界面
							msg.what = ENTER_HOME;
						}
					}
				} catch (MalformedURLException e) {
					e.printStackTrace();
					//进入应用程序主界面
					msg.what = URL_ERROR;
				} catch (IOException e) {
					//进入应用程序主界面
					e.printStackTrace();
					msg.what = IO_ERROR;
				} catch (JSONException e) {
					//进入应用程序主界面
					e.printStackTrace();
					msg.what = JSON_ERROR;
				}finally{
					long endTime = System.currentTimeMillis();
					//try catch finally此段代码强制执行4秒钟
					if(endTime - startTime<4000){
						//睡眠4秒
						try {
							Thread.sleep(4000-(endTime - startTime));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					mHandler.sendMessage(msg);
				}
			};
		}.start();
	}

	/**
	 * @return	返回版本名称
	 * 			如果返回null,获取版本名称异常
	 */
	private String getVersionName() {
		//获取版本号,PackageMananger---->PackageInfo------->versionName,versionCode
		//1,创建PackageMananger对象
		PackageManager pm = getPackageManager();
		//2,获取PackageInfo对象(包名,0获取PackageInfo对象)
		try {
			PackageInfo packageInfo = pm.getPackageInfo(getPackageName(),0);
			//3,获取版本名称
			return packageInfo.versionName;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * @return	返回版本号
	 * 			如果返回0,获取版本号称异常
	 */
	private int getVersionCode() {
		//获取版本号,PackageMananger---->PackageInfo------->versionName,versionCode
		//1,创建PackageMananger对象
		PackageManager pm = getPackageManager();
		//2,获取PackageInfo对象(包名,0获取PackageInfo对象)
		try {
			PackageInfo packageInfo = pm.getPackageInfo(getPackageName(),0);
			//3,获取版本名称
			return packageInfo.versionCode;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return 0;
	}

	private void initUI() {
		tv_version_name = (TextView) findViewById(R.id.tv_version_name);
		rl_root = (RelativeLayout) findViewById(R.id.rl_root);
	}
}
